package exam.test11.refer;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;

import java.io.FileReader;
import java.io.FileWriter;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

public class PDJSON {

	private List<PersonJSON> people;

	public PDJSON() {
		people = new ArrayList<PersonJSON>();
	}

	public void saveData(String filePath) { //写入数据
		//Gson gson = new Gson();
		Gson gson = new GsonBuilder().setPrettyPrinting().create();
		//两种方式，第一种就是直接创建一个gson对象，但是写出来的东西就都在一行
		//第二种方式，用builder创建，然后用setPrettyPrinting()将gson文件变得不是一行
		try (FileWriter fw = new FileWriter(filePath)) {//现在指定路径里创建一个可以放gson的文件
			//写在try括号里的叫try with resource
			gson.toJson(people, fw); //直接把要写入的数据用toJson()写入到指定文件里就可以了
			//toJson()这个方法接受的型参是object类，所以可以写任何东西
			//但是创建文件这个动作是单独做的，toJson 这个方法是直接把你提供的东西（people属性）放进你指定的文件内(fw)
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public List<PersonJSON> loadData(String filePath) { //读取数据
		Gson gson = new Gson();
		JsonReader jsonReader = null; //需要比写入数据多创建一个JsonReader的对象

		final Type CUS_LIST_TYPE = new TypeToken<List<PersonJSON>>() {
		}.getType(); //不用问为什么，记住就行了，想出什么类型的数据就 new TypeToken<>,尖括号里加这个数据类型就好了
		//or TypeToken.getParameterized(ArrayList.class, PersonJSON.class).getType();
		//同样两种方法
		//这两种方法的目的都是一样的，就是表明让fromJson()读取完成之后返回一个什么类型的数据作为结果
		//TypeToken<List<PersonJSON>>()表明想返回的是List<PersonJSON>这个类型
		//如果不写这一句话的话会报错

		try {
			jsonReader = new JsonReader(new FileReader(filePath)); //用jsonReader对象把需要读取的file承接住
		} catch (Exception e) {
			e.printStackTrace();
		}

		return gson.fromJson(jsonReader, CUS_LIST_TYPE); //用fromJson()输入想要读取的文件，也就是jsonReader，和想要输出的数据类型，也就是CUS_LIST_TYPE就可以了
	}

	public static void main(String[] args) {
		PDJSON pdj = new PDJSON();
		pdj.people.add(new PersonJSON(1, "Bart", "Simpson", new AddressJSON("Springfield", "USA")));
		pdj.people.add(new PersonJSON(2, "Homer", "Simpson", new AddressJSON("Springfield", "USA")));
		pdj.people.add(new PersonJSON(3, "Mickey", "Mouse", new AddressJSON("Orlando", "USA")));

		pdj.saveData("resources/listofpeople.json");

		List<PersonJSON> lp = pdj.loadData("resources/listofpeople.json");
		for (PersonJSON pj : lp) {
			System.out.println(pj.toString());
		}
	}
}